/**
 * 文件名    ： MyThreadPoolExecutor.java
 * 版权       : XX科技有限公司。
 * 描述       : <描述>
 * 修改时间：2018年11月11日
 * 修改内容：<修改内容>
 */
package com.example.demo.application.threadutil;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;

import org.apache.tomcat.util.threads.ThreadPoolExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/** 统一调度线程
 * <一句话功能简述>
 * <功能详细描述>
 * @author    87431
 * @version   [版本号，2018年11月11日]
 * @see       [相关类/方法]
 * @since     [产品/模块版本]
 */
public class MyThreadPoolExecutor {
	protected static final Logger log = LoggerFactory.getLogger(MyThreadPoolExecutor.class);
	protected static final Map<String, LinkedBlockingQueue<Runnable>> queueMap = new HashMap<String, LinkedBlockingQueue<Runnable>>();
	protected static final Map<String, ThreadPoolExecutor> threadPoolMap = new HashMap<String, ThreadPoolExecutor>();
	public static final String pname = "pool";
	
	static{
		
		MythreadConfig.init();
		for (int i = 1; i <= MythreadConfig.poolSize; i++) {
			LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>();
			queueMap.put(pname+i, queue);
			ThreadPoolExecutor thPool = new ThreadPoolExecutor(0, 1, 10, TimeUnit.SECONDS, queue);
			threadPoolMap.put(pname+i, thPool);
		}
		
	}
	
	/** 类的单例对象
	 * <一句话功能简述>
	 * <功能详细描述>
	 * @return
	 * @see [类、类#方法、类#成员]
	 */
	public static MyThreadPoolExecutor getInstance() {
		return MyThreadPoolExecutorHandler.thread;
	}
	
	private MyThreadPoolExecutor() {
	}
	
	
	/** 线程执行 统一调度
	 * <一句话功能简述> 请给每一个 线程 thread起名称，后再传进来
	 * <功能详细描述>
	 * @param r 线程
	 * @see [类、类#方法、类#成员]
	 */
	public void execute(Runnable r,int index){
		threadPoolMap.get(pname+index).execute(r);
	}
	
	/** 获得阻塞的 线程数量（等待执行的）
	 * <一句话功能简述>
	 * <功能详细描述>
	 * @return
	 * @see [类、类#方法、类#成员]
	 */
	public int getBlockSize(int index){
		LinkedBlockingQueue<Runnable> obj = queueMap.get(pname+index);
		if (null == obj) {
			return -1;
		}
		return obj.size();
	}
	
	/** 静态内部类
	 * <一句话功能简述>
	 * <功能详细描述>
	 * @author    87431
	 * @version   [版本号，2018年11月11日]
	 * @see       [相关类/方法]
	 * @since     [产品/模块版本]
	 */
	static class MyThreadPoolExecutorHandler{
		public static MyThreadPoolExecutor thread = new MyThreadPoolExecutor();
	}
}
